圖片來源:https://www.epochtimes.com/b5/18/1/5/n10026856.htm
我先來講個故事吧~ 故事的主角小明,今年30歲單身,一個人住在租的套房裡,每天工作加班累的半死,回家馬上倒頭就睡,隔天早上起來又急急忙忙出門上班了,根本沒有時間看明天的天氣預報。
一直以來都沒有什麼問題,直到某一天發生一件不幸的事,小明下班時外面下著大雨,自己也沒有帶傘,一查才發現原來今天的下雨機率高達90%!! 小明此時覺得很氣惱,心想:如果有人可以在出門前提醒我帶傘就好了...。
於是他將煩惱告訴了他的好友,也就是你,身為工程師的你很同情他,沒有女朋友已經很可憐了,竟然還要淋雨回家,因此你決定寫一個程式來幫助小明!!
小明的需求是每天早上出門前自動通知天氣資訊,因此專案的架構會長這樣:每天早上6點執行Python程式,由程式取得氣象資料後,經過一些處理後,再推送訊息給小明。那因為LINE是我們很常用的通訊軟體,所以就使用LINE Notify推送訊息給小明,如此一來小明只要早上看LINE就知道今天的天氣資訊了!
首先,專案最重要的東西就是氣象資料,而且要每天更新,又有涵蓋很多地區。好消息是,中央氣象局提供的氣象資料API就有這些特點,我們就是要使用這個。
打開中央氣象局氣象資訊API文件,底下列出非常多API,而我們要用的是第一個(一般天氣預報-今明 36 小時天氣預報)。
點開後,可以看到API的所有參數,其中「Authorization」這一項是必填的,這是開放資料平台會員的授權碼,要有這個授權碼才能使用API,接著就要來講怎麼取得這個授權碼。
回到剛才的中央氣象局氣象資訊API文件,點API右上方「Try it out」按鈕來測試API。
將授權碼填上去,底下參數基本上預設值就好,特別需要改的是「locationName」這個參數,選擇你所在的縣市。
按下「Execute」,下方就會顯示回傳結果,回傳的結果是JSON格式的字串。
根據這份文件來觀察回傳的JSON字串,就可以知道各個欄位所代表的含意。我們發現到 weatherElement 這個列表中存著天氣資訊,而每筆天氣資訊的第一筆是離現在最近12小時的資料(因為我們是每天早上6點抓取資料,所以第一筆資料就是當天6點到18點的資料,正是我們需要的)。
解析API的程式碼如下,為了方便測試特別寫成函數。
def get_data():
url = "https://opendata.cwb.gov.tw/api/v1/rest/datastore/F-C0032-001"
params = {
"Authorization": "你的API授權碼",
"locationName": "你的城市",
}
response = requests.get(url, params=params)
print(response.status_code)
if response.status_code == 200:
# print(response.text)
data = json.loads(response.text)
location = data["records"]["location"][0]["locationName"]
weather_elements = data["records"]["location"][0]["weatherElement"]
start_time = weather_elements[0]["time"][0]["startTime"]
end_time = weather_elements[0]["time"][0]["endTime"]
weather_state = weather_elements[0]["time"][0]["parameter"]["parameterName"]
rain_prob = weather_elements[1]["time"][0]["parameter"]["parameterName"]
min_tem = weather_elements[2]["time"][0]["parameter"]["parameterName"]
comfort = weather_elements[3]["time"][0]["parameter"]["parameterName"]
max_tem = weather_elements[4]["time"][0]["parameter"]["parameterName"]
print(location)
print(start_time)
print(end_time)
print(weather_state)
print(rain_prob)
print(min_tem)
print(comfort)
print(max_tem)
else:
print("Can't get data!")
執行結果:
200
臺中市
2021-09-30 18:00:00
2021-10-01 06:00:00
晴時多雲
20
27
舒適至悶熱
31
今天順利地取得氣象資料了,明天就透過LINE Notify傳送訊息吧!
如果喜歡這系列文章麻煩幫我按Like加訂閱,你的支持是我創作最大的動力~
本系列文章以及範例程式碼都同步更新在GitHub上,後續會持續的更新,如果喜歡也麻煩幫我按個星星吧~
有任何問題或建議,都歡迎在底下留言區提出,還請大家多多指教。